const db = wx.cloud.database()      //获取数据库对象
const pics = db.collection('pics')  //获取图片数据库
const votes = db.collection('votes')//获取投票数据库
const $ = db.command.aggregate      //新建函数引用 (MangDB数据库.命令.聚集) 详情请百度
const maxcount = 3                  //用户单日投票上限
Page({
    data: {
        current: 0,                 //当前显示项
        showView: false,            //是否显示当前项
        count: 0                    //当前票数
    },
    async onLoad() {                //页面载入函数 - 手动定义参数_id 用于获取投票的文件id(默认为空)
        let res = await wx.cloud.callFunction({name: 'login',}) //用户登录
        console.log("login",res)                                //输出登录结果
        let openid = res.result.openid                          //保存用户id
        this.setData({openid})                                  //同步数据
        let today = new Date().toJSON().slice(0, 10)            //今日日期
        res = await votes.aggregate()                           //调用 MongDB函数 聚集
            .match({ _openid: openid})                          //匹配用户ID
            .project({                                          //格式化数据
                _openid: 1,
                'date': $.dateToString({                        //格式化日期
                    date: '$date',
                    format: '%Y-%m-%d'
                })
            })
            .match({date: today})                               //匹配 今日日期
            .group({                                            //按 用户ID 进行排序
                _id: "$_openid",                                //返回 用户ID
                count: $.sum(1)                                 //返回 (调用 aggregate.sum 统计的投票数)
            }).end()                                            //结束
        let count                                               //投票数
        if(res.list[0])                                         //若列表存在
            count = res.list[0]['count']                        //投票数 = 列表数据
        else                                                    //若列表不存在
            count=null                                          //投票数为空
        let plist = await pics.aggregate().group({              //获取图片列表 按文件ID排序
            _id: '$fileid'
        }).end()
        plist = plist.list                                      //修改变量索引 以 直接调用 图片列表
        let vlist = await votes.aggregate().group({             //投票列表按 文件ID排序
            _id: '$fileid',
            count: $.sum(1)
        }).end()
        vlist = vlist.list                                      //修改变量索引 以 直接调用 列表

        plist.map(v => {                                        //返回指定函数处理后的图片列表    v=>{} 是一个匿名函数
            let found = vlist.find(vv => {return vv._id == v._id})//寻找用户投票数
            v.count = found ? found.count:0                     // 当前项.投票数 = 是否找到 ? 找到的投票数 : 0
        })
        let current=0                                           //当前项=0
        let last=this.data.last_operate                         //上次操作图片
        if(last)                                                //若有上次操作,跳到对应图片
            current = plist.findIndex(x=>{return x.fileid==last})
        if(current<0) current=0
        this.setData({plist,vlist,current,count})               //同步数据
        this.setBar(current)                                    //切换当前项
    },
    async longnew() {                                           //长按函数(上传图片)
        let res = await wx.chooseMedia({count: 1})              //调用 微信 选择媒体 函数
        let filename = res.tempFiles[0].tempFilePath            //获取文件 完整文件名
        console.log(filename)                                   //输出文件 完整文件名
        let purefilename = filename.split('/').slice(-1)[0]     //截取 文件名
        res = await wx.cloud.uploadFile({                       //调用 微信 上传文件
            cloudPath: 'picsimages/' + purefilename,            //云端保存路径
            filePath: filename                                  //要上传的文件路径
        })
        let fileid = res.fileID                                 //获取文件ID
        res = await pics.add({                                  //图片数据库添加项
            data: {fileid}                                      //数据:文件ID
        })
        this.setData({last_operate:fileid})
        if (res.errMsg.indexOf('ok') > 0)                       //如果程序不报错
            this.onLoad()                                       //调用 onLoad 函数
    },
    async tap(e) {                                              //点击事件(投票)
        if (this.data.count >= maxcount) {                      //如果 当前投票数 >= 最大投票数
            wx.showToast({title: '超过投票次数'})                //提示 超过
            return                                              //不投票 返回
        }
        let fileid = e.currentTarget.dataset.id                 //文件ID = 点击对象.点击元素.属性.id
        await votes.add({                                       //添加投票信息
            data: {fileid,date: db.serverDate()}                //数据: 文件ID  服务器日期
        })
        this.setData({                                          //同步数据
            count: this.data.count == null ? 0 : this.data.count,
            last_operate : fileid
        })
        let remain=parseInt(maxcount-this.data.count-1)          //剩余次数
        if(remain<0) remain=0                                    //负数取0
        wx.showToast({title:'还有'+remain+'次投票机会'})      //弹窗
        this.onLoad()
    },
    change(e) {                                                 //切换当前项
        let current = e.detail.current
        this.setData({current})
        this.setBar(current)
    },
    setBar(current) {                                          //更新当前项
        wx.setNavigationBarTitle({                             //更新程序标题
            title: current + 1 + '/' + this.data.plist.length + ' ' + this.data.plist[current].count + '票',
        })
    }
})